/**************基于51单片机的数字音乐盒***********/

#include <REGX52.H>		//51单片机头文件  REGX52.H比 reg52.h的宏定义多一些！
#include "Tim.h"		//定时器的头文件
#include "Delay.h"		//延时函数
#include "LCD1602.h"	//LCD1602液晶屏头文件
#include "Music.h"      // 音乐
#include "Key.h"        // 按键


/******变量-标志位******/
unsigned char Music_Mode = 0;			//模式--- 0 暂停(停止)，123分别代表第123首歌曲
unsigned char Music_Mode_Select = 0;		//模式选择按键
unsigned char FreqSelect,MusicSelect;

unsigned char keynum = 0;
unsigned int uwtick, key_tick;
unsigned char play_stop_flag = 0;   //0 stop - 1 play


/*******函数声明*******/
static void Key_Proc(void);					//按键扫描函数
static void LCD_Show_Proc(void);            // LCD显示函数
void Select_MusicMode_Function(void);	    //选择音乐模式函数

void main()
{
    Timer1_Init();
	Timer0_Init();	//初始化默认停止计时，TR0 = 0;
    
	LCD_Init();		
	//开机动画
	LCD_ShowString(1,1,"  Music Player ");	//第一行第一列显示ABC
	LCD_ShowString(2,1,"  Music OFF");	//开机默认显示 Music OFF
	while(1)
	{
        keynum = Key_GetNum();
		Key_Proc();
		Select_MusicMode_Function();
        LCD_Show_Proc();
	}
}

/*******定时器0的中断服务子函数*******/
void Timer0_Isr(void) interrupt 1  
{
    // 播放音乐的函数
	//1ms进一次，2ms一周期，频率f=500Hz
	if(FreqTable[FreqSelect])	//如果不是休止符
	{
		TL0 = FreqTable[FreqSelect]%256;		//设置定时初值
		TH0 = FreqTable[FreqSelect]/256;		//设置定时初值
		Buzzer=!Buzzer;//翻转蜂鸣器IO口
	}
}

void Timer1_Isr(void) interrupt 3
{
    static unsigned int T1Count, key_scan;
    
	TL1 = 0x18;				//设置定时初始值
	TH1 = 0xFC;				//设置定时初始值
    uwtick++;
    if (uwtick >= 65530)
        uwtick = 0;
    
	if(++T1Count >= 1000)
	{
		
		T1Count=0;//清零重记次
	}
    if (++key_scan >=20)
    {
        Key_Loop(); //按键扫描
        key_scan = 0;
    }
}


/**********************函数部分**********************/
static void Key_Proc(void)	//按键扫描函数
{
    if (1 == keynum)
    {
        Music_Mode_Select ++;
        if (Music_Mode_Select > 9)  //1-9
            Music_Mode_Select = 1;
        MusicSelect = 0; 
    }
    else if (2 == keynum)
    {
        play_stop_flag = !play_stop_flag;
    }
    
//	if (0 == KEY1) 	{Music_Mode_Select = 1;MusicSelect = 0; LCD_ShowString(2,1,"Music 1      ");}	//按键1按下，选择模式0，MusicSelect乐谱索引清零，LCD提示 Music 1
//	if (0 == KEY2) 	{Music_Mode_Select = 2;MusicSelect = 0; LCD_ShowString(2,1,"Music 2      ");}
//	if (0 == KEY3) 	{Music_Mode_Select = 3;MusicSelect = 0; LCD_ShowString(2,1,"Music 3      ");}
//	if (0 == KEY4)	//按键4开始播放所选择的乐曲 左边的黄色按键，播放
//	{
//		Music_Mode = Music_Mode_Select;	//将当前选择的模式赋值给Music_Mode变量
//		TR0 = 1;	//音乐开启
//        LCD_ShowString(2,1,"Music play  ");
//	}
//	if (0 == KEY5)	//如果按键5按下，暂停功能
//	{	
//        Music_Mode = 0;
//        LCD_ShowString(2,1,"Music stop  ");
//    }
}

static void LCD_Show_Proc(void)
{
    if (uwtick - key_tick < 1000)    //500ms
		return;
	key_tick = uwtick;
    
    
    if (play_stop_flag == 0)    //stop
    {
        Music_Mode = 0;
        
        if (Music_Mode_Select == 1)
        {
            LCD_ShowString(2,1,"  Music 1 stop ");
        }
        else if (Music_Mode_Select == 2)
        {
            LCD_ShowString(2,1,"  Music 2 stop ");
        }
        else if (Music_Mode_Select == 3)
        {
            LCD_ShowString(2,1,"  Music 3 stop ");
        }
        else if (Music_Mode_Select == 4)
        {
            LCD_ShowString(2,1,"  Music 4 stop ");
        }
        else if (Music_Mode_Select == 5)
        {
            LCD_ShowString(2,1,"  Music 5 stop ");
        }
        else if (Music_Mode_Select == 6)
        {
            LCD_ShowString(2,1,"  Music 6 stop ");
        }
        else if (Music_Mode_Select == 7)
        {
            LCD_ShowString(2,1,"  Music 7 stop ");
        }
        else if (Music_Mode_Select == 8)
        {
            LCD_ShowString(2,1,"  Music 8 stop ");
        }
        else if (Music_Mode_Select == 9)
        {
            LCD_ShowString(2,1,"  Music 9 stop ");
        }
        
        
    }
    else if (play_stop_flag == 1)   //play
    {
        Music_Mode = Music_Mode_Select;	//将当前选择的模式赋值给Music_Mode变量
		TR0 = 1;	//音乐开启
        LCD_ShowString(2,1,"  Music play   ");
    }

    
}



void Select_MusicMode_Function(void)
{
	if (0 == Music_Mode)
	{
		TR0 = 0;	//暂停计时
		
	}		
	if (1 == Music_Mode)	//模式1 --- 歌曲1 --- 《花海》
	{
//        LCD_ShowString(2,1,"Music 1 play");
		if(Music_HuaHai[MusicSelect]!=0xFF)//如果不是停止标志位
		{
            
			FreqSelect = Music_HuaHai[MusicSelect];//选择音符对应的频率
			MusicSelect++;
			Delay((SPEED/4)*Music_HuaHai[MusicSelect]);//十六分音符是125ms，选择音符对应的时值
			MusicSelect++;
			TR0=0;
			Delay(5);	//音符间短暂停顿
			TR0=1;
		}
		else	//如果是停止标志位
		{
			Music_Mode = 0;		//清零Music_Mode变量，改变成模式0，代表暂停（停止）
//				TR0=0;
//				while(1);//播放完死循环
//            LCD_ShowString(2,1,"Music 1 stop");
		}
	}
		
	if (2 == Music_Mode)	//模式2 --- 歌曲2 --- 《天空之城》
	{
//        LCD_ShowString(2,1,"Music 2 play");
		if(Music_Castle_in_the_Sky[MusicSelect]!=0xFF)//如果不是停止标志位
		{
			FreqSelect = Music_Castle_in_the_Sky[MusicSelect];//选择音符对应的频率
			MusicSelect++;
			Delay((SPEED/4)*Music_Castle_in_the_Sky[MusicSelect]);//十六分音符是125ms，选择音符对应的时值
			MusicSelect++;
			TR0=0;
			Delay(5);	//音符间短暂停顿
			TR0=1;
		}
		else	//如果是停止标志位
		{
			Music_Mode = 0;
//            LCD_ShowString(2,1,"Music 2 stop");
		}
	}
		
	if (3 == Music_Mode)	//模式3 --- 歌曲3 --- 《勇气大爆发》
	{
//		 LCD_ShowString(2,1,"Music 3 play");
		if(Music_3[MusicSelect]!=0xFF)				//如果不是停止标志位
		{
           
			FreqSelect = Music_3[MusicSelect];		//选择音符对应的频率
			MusicSelect++;
			Delay((SPEED/4)*Music_3[MusicSelect]);	//十六分音符是125ms，选择音符对应的时值
			MusicSelect++;
			TR0=0;
			Delay(5);	//音符间短暂停顿
			TR0=1;
		}
		else	//如果是停止标志位
		{
			Music_Mode = 0;
//            LCD_ShowString(2,1,"Music 3 stop");
		}
	}
    
    if (4 == Music_Mode)	//模式4 --- 歌曲4 --- 《勇气大爆发》
	{
//		 LCD_ShowString(2,1,"Music 3 play");
		if(Auld_Lang_Syne[MusicSelect]!=0xFF)				//如果不是停止标志位
		{
			FreqSelect = Auld_Lang_Syne[MusicSelect];		//选择音符对应的频率
			MusicSelect++;
			Delay((SPEED/4)*Auld_Lang_Syne[MusicSelect]);	//十六分音符是125ms，选择音符对应的时值
			MusicSelect++;
			TR0=0;
			Delay(5);	//音符间短暂停顿
			TR0=1;
		}
		else	//如果是停止标志位
		{
			Music_Mode = 0;
		}
	}
    
    if (5 == Music_Mode)	//模式4 --- 歌曲4 --- 《勇气大爆发》
	{
//		 LCD_ShowString(2,1,"Music 3 play");
		if(Music_xiaoxingxing[MusicSelect]!=0xFF)				//如果不是停止标志位
		{
			FreqSelect = Music_xiaoxingxing[MusicSelect];		//选择音符对应的频率
			MusicSelect++;
			Delay((SPEED/4)*Music_xiaoxingxing[MusicSelect]);	//十六分音符是125ms，选择音符对应的时值
			MusicSelect++;
			TR0=0;
			Delay(5);	//音符间短暂停顿
			TR0=1;
		}
		else	//如果是停止标志位
		{
			Music_Mode = 0;
		}
	}
    
}


